const express = require('express')
// 使用fs模块,删除广告图片
const fs = require('fs')
// 引入path模块,拼接被删除的文件的绝对路径
const { resolve } = require('path')

const advModel = require('../db/models/advModel')
const adminModel = require('../db/models/adminModel')
const router = express.Router()
// 引入我们自己封装的jwtManger
const jwtManger = require('../utils/jwtManger')

// 定义一个验证token的中间件,广告的增删改查都要先校验token
async function verToken(req, res, next) {
  // 接收当前登录用户的id
  const id = req.fields.id || req.query.id
  // 接收请求头中的token
  const token = req.get('token')
  // 判断如果没有token,则不继续校验
  if (!token) return res.send({ status: 0, message: 'token失效,请重新登录' })
  // 校验传上来的token和我们数据库中的token是否一致
  const admin = await adminModel.findOne({ _id: id, token })
  // 如果admin是一个对象,则说明token是一致的.就继续判断是否在有效期,如果admin是null则说明token错误
  if (!admin) return res.send({ status: 0, message: 'token失效,请重新登录' })

  // 校验token的有效期
  // 1. 解密token
  const obj = jwtManger.decodeToken(token)
  // 获取当前登录用户token有效期的截止时间
  const loginTime = obj.expires
  // 获取校验token的时间戳
  const currentTime = Date.now()
  // 判断如果token截止时间小于当前时间,则说明token失效
  if (currentTime >= loginTime)
    return res.send({ status: 0, message: 'token失效,请重新登录' })
  // 说明上面的三次校验都通过,则表示登录有效
  next()
}

//添加广告接口
router.post('/addAdv', verToken, async (req, res) => {
  // 获取添加广告表单中的普通信息
  const { advTitle, advLink, advCate } = req.fields
  // 获取广告图片的文件信息
  const { file } = req.files
  // 根据上传的文件信息.拼接一个可以被访问的url地址
  // http://localhost:5001/uploadDir/文件名
  // 获取上传到服务器之后文件的名字
  const filename = file.path.replace('public\\uploadDir\\', '')
  // 拼接url地址
  const advImg = 'http://localhost:5001/uploadDir/' + filename
  // 将广告数据存储到数据库中
  await advModel.create({ advTitle, advLink, advCate, advImg })
  // 添加完毕之后,从新获取数据库中所有广告数据,并相应给浏览器
  const advs = await advModel.find()
  res.send({ status: 1, message: '广告添加成功', advs })
})

// 查询所有广告数据
router.get('/getAdvs', verToken, async function (req, res) {
  const advs = await advModel.find()
  res.send({ status: 1, message: '查询成功', advs })
})

// 删除广告
router.post('/delAdv', verToken, async function (req, res) {
  const { advId } = req.fields
  // 删除之前先找到这条广告数据,拿到广告图片的文件名
  const adv = await advModel.findOne({ _id: advId })
  const filename = adv.advImg.replace('http://localhost:5001/uploadDir/', '')
  await advModel.deleteOne({ _id: advId })
  // 手动的删除当前这条数据所对应的图片
  const path = resolve(__dirname, '../public/uploadDir', filename)
  fs.unlinkSync(path)
  const advs = await advModel.find()
  res.send({ status: 1, message: '删除成功', advs })
})

module.exports = router
